// quando lo specificatore d'accesso alla classe č public


// tutti i membri protetti della classe base
// diverranno protetti della classe derivata1


#include <iostream>
using namespace std;

class base
{
protected:  
int i,j; // privato di base, ma accessibile da derivata
public:
void imposta (int a, int b) {i=a; j=b;}
void mostra() {cout << i << " " << j << "\n";}
};

class derivata1 : public base
{
int k;
public:
// derivata1 puņ accedere alle variabili i e j di base
void impostak() {k=i*j;}
void mostrak() {cout << k << "\n";};
};

class derivata2 : public derivata1
// i e j sono ereditate indirettamente tramite derivata1
// solo perche derivata1 eredita base come public
{ 
int m;
public:
// derivata1 puņ accedere alle variabili i e j di base
void impostam() {m=i-j;}
void mostram() {cout << m << "\n";};
};

int main()
{
derivata1 ob1;
derivata2 ob2;
ob1.imposta(2,3); // noto in derivata1
ob1.mostra();  // accesso ad un membro della classe base
ob1.impostak();
ob1.mostrak(); // noto in derivata1


ob2.imposta(4,5); 
ob2.mostra();  
ob2.impostak();
ob2.impostam();
ob2.mostrak(); 
ob2.mostram(); 
return 0;
}

/*
2 3
6
4 5
20
-1
Press any key to continue
*/

